package com.example.juc.kingdom_adventures.term1;

import org.junit.Test;

public class Client {
    private int number = 0;

    private void read() {
        System.out.println("number = " + number);
    }

    /**
     * 在 write 方法执行时，实际上会执行三条语句
     * ILOAD
     * IADD
     * ISTORE
     * wirte方法不是一个原子操作，三条指令的执行可能被操作系统中断切换其他线程执行
     *
     * @param change
     */
    private void write(int change) {
        number += change;
    }

    @Test
    public void test() throws InterruptedException {
        // 开启一个线程加 10000 次
        new Thread(() -> {
            for (int i = 0; i < 10000; i++) {
                write(1);
            }
            System.out.println("增加 10000 次已完成");
        }).start();

        // 开启一个线程减 10000 次
        new Thread(() -> {
            for (int i = 0; i < 10000; i++) {
                write(-1);
            }
            System.out.println("减少 10000 次已完成");
        }).start();

        // 睡眠一秒保证线程执行完成
        Thread.sleep(1000);
        // 读取结果
        read();
    }
}

